/**
 * 
 */
package unifor.filetransfer.util;

import java.util.ArrayList;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.JTextArea;

/**
 * @author Arthur Landim
 *
 */
public class ProtocoloUtil {
	
	public static void main(String[] args) {
//		byte[] r = toByteArray(500, 4);
//		for (int i=0; i< r.length; i++) {
//			System.out.print(" " + toInt(r[i]));
////			System.out.println(Integer.toBinaryString(toInt(r[i])));
//		}
//		System.out.println("\n" + toInt(r));
//		System.out.println("\n------------------------");
		
//		byte[] bytes = toByteArray((byte) 250, 2);
//		for (int i=0; i< bytes.length; i++) {
//			System.out.print(" " + toInt(bytes[i]));
////		System.out.println(Integer.toBinaryString(toInt(r[i])));
//		}
		
		
		int num = 255;
		int quociente  = 0;
		List<Integer> lista = new ArrayList<Integer>();
		while ((quociente = num/2) != 1) {
			lista.add(new Integer(num%2));
			num = quociente;
		}
		lista.add(new Integer(num%2));
		lista.add(new Integer(quociente));
		String bin = new String();
		for (Integer inte : lista) {
			System.out.print(inte.intValue());
			bin = Integer.toBinaryString(inte.intValue()) + bin;
		}
//		System.out.println(bin);
		System.out.println();
		
		for(int i=0;i<bin.length();i++) {
			System.out.print(bin.charAt(i));
		}
		System.out.println();
		byte[] array = new byte[4];
		for(int i=0; i<4;i++) {
			array[i] = (byte) Integer.parseInt(bin.substring(i, i+1));
			System.out.print(array[i]);
		}
		System.out.println("\n" +toIntByBinary(array));
		
		
		
//		CabecalhoIPT cab = new CabecalhoIPT();
//		cab.setVersao((byte) 4);
//		cab.setTamanho((byte) 15);
//		
//		byte[] array = CriadorDatagrama.criaDatagrama(cab);
//		System.out.println(Integer.toBinaryString(toInt(array[0])));
//		System.out.println(array);
//		
//		System.out.println("\n----separando baites--------------------");
//		
//		byte[] outro = splitByte(array[0]);
//		for (int i=0; i< outro.length; i++) {
//			System.out.println(Integer.toBinaryString(toInt(outro[i])));
//		}
		
//		System.out.println(Byte.MAX_VALUE);
	}

	public static JFrame frame;
	public static JTextArea logEnvio;
	public static JProgressBar barra;
	
	public static void log(String str) {
		
		logEnvio.setText(logEnvio.getText() + "\n" + str);
		logEnvio.repaint();
	}

	public static void incrementaEnvio() {
		barra.setValue(barra.getValue() + 1);
		barra.repaint();
	}
	
	public static void desincrementaEnvio() {
		barra.setValue(barra.getValue() - 1);
	}
	
	public static byte[] toByteArray(String str) {
		char[] c = str.toCharArray();
		byte[] result = new byte[c.length];
		
		for (int i=0; i<c.length; i++) {
			result[i] = (byte) c[i];
		}
		return result;
	}
	
	public static byte[] toByteArray(String str, int arrayLength) {
		char[] c = str.toCharArray();
		byte[] result = new byte[arrayLength];
		int k = result.length - 1;
		for (int i=c.length-1; i>=0;k--, i--) {
			result[k] = (byte) c[i];
		}
		return result;
	}
	
	public static byte[] toByteArray(int numero) {
		
		if (numero < 256) {
			return new byte[]{(byte) numero};
		}
		List<Byte> resultado = new ArrayList<Byte>();
		resultado.add(new Byte((byte) (numero / 256)));
		int resto = numero % 256;
		int i = 1;
		for (i=1; resto > 255;i++) {
			resultado.add(new Byte( (byte) (resto / 256) ) );
			resto = numero % 256;
		}
		resultado.add(new Byte( (byte) resto ) );
		
		byte[] result = new byte[i+1];
		int outroI = 0;
		for (Byte by : resultado) {
			result[outroI++] = by.byteValue(); 
		}
		return result;
	}
	
	public static byte[] toByteArray(int numero, int arrayLength) {
		byte[] resultado = new byte[arrayLength];
		int num = numero;
		int quociente  = 0;
		List<Integer> lista = new ArrayList<Integer>();
		while ((quociente = num/2) != 1) {
			lista.add(new Integer(num%2));
			num = quociente;
		}
		lista.add(new Integer(num%2));
		lista.add(new Integer(quociente));
		String bin = new String();

		for (Integer inte : lista) {
			bin = Integer.toBinaryString(inte.intValue()) + bin;
		}
		int r = 0;
		if ((r = bin.length() % 8) > 0  ) {
			int qtd = ((8*((bin.length() / 8)+1) - bin.length()));
			for (int i=0; i<qtd; i++) {
				bin = "0" + bin;
			}
		}
		int q=0;
		if ((q = bin.length() / 8) < arrayLength)  {
			for (int i=0; i< (arrayLength - q); i++) bin = "00000000" + bin;
			
		}
		
		System.out.println();
		for(int i=0,j=0; j<resultado.length;j++) {
			byte[] temp = new byte[8];
			for (int k=0;k<temp.length;k++,i++) {
				temp[k] = (byte) Integer.parseInt(bin.substring(i, i+1));
			}
			resultado[j] = (byte) toIntByBinary(temp);
			System.out.print(resultado[j]);
		}
		return resultado;
	}
	
	public static byte[] toByteArray(byte numero, int arrayLength) {
		
		List<Byte> resultado = new ArrayList<Byte>();
		int i = 1;
		int divisor = 8 * arrayLength;
		if (toInt(numero) < divisor) {
			i--;
			resultado.add(new Byte(numero));
//			return new byte[]{(byte) numero};
		} else {
			resultado.add(new Byte((byte) (toInt(numero) / divisor)));
			int resto = toInt(numero) % divisor;
			for (i=1; resto > divisor;i++) {
				resultado.add(new Byte( (byte) (resto / divisor)) );
				resto = numero % divisor;
			}
			resultado.add( new Byte( (byte) resto ) );
			 
		}
		byte[] result = new byte[arrayLength];
		
		int k = 0;

		for (;k<arrayLength;k++) {
			result[k] = resultado.get(k).byteValue(); 
		}
		return result;
	}
	
	public static int toInt(byte b) {

		if (b < 0) {
			return 256 + b;
		}
		return b ;
	}
	
	public static int toInt(byte[] b) {
		
		int resultado = 0;
		
		for (int i=b.length-1,k=0; i>=0; i--,k++) {
			if (i==b.length-1) {
				resultado += toInt(b[i]);
			} else {
				resultado += (toInt(b[i]) << (8* k)) ;
			}
		}
		
		return resultado;
	}
	
	public static int toIntByBinary(byte[] b) {
		
		int resultado = 0;
		
		for (int i=b.length-1,k=0; i>=0; i--,k++) {
			if (i==b.length-1) {
				resultado += toInt(b[i]);
			} else {
				resultado += java.lang.Math.pow(2 * toInt(b[i]), k) ;
			}
		}
		
		return resultado;
	}
	
	public static byte[] splitByte(byte baite) {
				
		byte[] resultado = new byte[2];

		resultado[0] = (byte) (baite / 16);
		resultado[1] = (byte) (baite - ((baite / 16) * 16));
		
		return resultado;
	}
	
}
